package showgo.modell.stueck;

import java.util.ArrayList;
import java.util.List;

/**
 * Ein Theaterstueck besteht aus einem Titel, mindestens einem Akt und einer
 * Anzahl von Rollen.
 * 
 * @author lutz
 * 
 */
public class Stueck {
    private String titel;

    private List<Akt> akte;

    private List<Rolle> rollen;

    public String getName() {
	return titel;
    }

    public void setName(String name) {
	this.titel = name;
    }

    public List<Akt> getAkte() {
	return akte;
    }

    public void setAkte(List<Akt> akte) {
	this.akte = akte;
    }

    public List<Rolle> getRollen() {
	return rollen;
    }

    public void setRollen(List<Rolle> rollen) {
	this.rollen = rollen;
    }

    public Stueck(String name, List<Akt> akte, List<Rolle> rollen) {
	super();
	this.titel = name;
	this.akte = akte;
	this.rollen = rollen;
    }

    public Stueck tiefeKopie() {
	String neuerTitel = this.titel;

	List<Rolle> neuRollen = new ArrayList<Rolle>();
	for (int i = 0; i < this.rollen.size(); i++) {
	    Rolle neuRolle = this.rollen.get(i).tiefeKopie();
	    neuRollen.add(neuRolle);
	}

	List<Akt> neuAkte = new ArrayList<Akt>();
	for (int i = 0; i < this.akte.size(); i++) {
	    Akt neuAkt = this.akte.get(i).tiefeKopie();
	    neuAkte.add(neuAkt);
	}

	Stueck neuesStueck = new Stueck(neuerTitel, neuAkte, neuRollen);
	return neuesStueck;
    }

    public Stueck flacheKopie() {
	Stueck neuesStueck = new Stueck(this.titel, this.akte, this.rollen);
	return neuesStueck;
    }

    @Override
    public String toString() {
	String string = this.titel;
	for (int i = 0; i < this.akte.size(); i++) {
	    string += "\n" + "\n";
	    string += this.akte.get(i).toString();
	}
	string += "\n";
	for (int i = 0; i < this.rollen.size(); i++) {
	    string += "\n" + this.rollen.get(i).toString();
	}
	return string;
    }

    public void refreshRollen() {
	// Wurden Aenderungen am Stueck durchgefuehrt,
	// werden mit dieser Methode die verbleibenden Rollen
	// im Stueck neu geladen;
	for (int i = 0; i < this.getRollen().size(); i++) {
	    String rollenName = this.getRollen().get(i).getRollenName();
	    // Ist diese Rolle nicht mehr im Stueck zu finden,
	    // wird sie aus dem Stueck entfernt
	    if (!rolleIstNochVorhanden(rollenName)) {
		this.getRollen().remove(i);
	    }
	}
    }

    private boolean rolleIstNochVorhanden(String rollenName) {
	for (Akt akt : this.getAkte()) {
	    for (Szene szene : akt.getSzenen()) {
		for (Absatz absatz : szene.getAbsaetze()) {
		    if (absatz.getAbsatzID().equals("Redepassage")) {
			Rede rede = (Rede) absatz;
			if (rollenName.equals(rede.getRollenName())) {
			    return true;
			}
		    }
		}
	    }
	}
	return false;
    }

}
